package cmc.asiainfo.com.baidumap;

import android.app.Application;
import android.content.Context;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.telephony.TelephonyManager;

import com.lzy.okgo.OkGo;

import java.util.logging.Level;

import cmc.asiainfo.com.xiht_bmap.BaiduMapUtil;
import cmc.asiainfo.com.xiht_bmap.locationMap.MapLocationUtil;


/**
 * @Author xihaitao
 * @Date 2017/2/8
 * @Function:
 *      全局设置，一些基础的、需要在应用完全启动之前就初始化完毕的设置
 */
public class MyApplication extends Application {
    private static final String TAG = MyApplication.class.getSimpleName();

    // 单例
    private static MyApplication instance;
    // 获取包信息
    private static PackageInfo packageInfo;
    // 用于获取设备信息
    private static TelephonyManager telephonyManager;

    @Override
    public void onCreate() {
        super.onCreate();

        instance = this;

        // 初始化OkGo网络请求框架
        OkGo.init(this);
        // 对网络请求公共部分进行设置
        setNet();

        //在使用SDK各组件之前初始化context信息，传入ApplicationContext
        //注意该方法要再setContentView方法之前实现，最好放在Application中，并且必须传入ApplicationContext
        BaiduMapUtil.getInstance().mapLibInit(getApplicationContext());

        initBaiduMapLocation();
    }

    /**
     * @Author 席海涛[xiht@asiainfo.com]
     * @Date 2017/2/9 16:30
     * @Function:
     *      初始化百度地图定位数据
     */
    private void initBaiduMapLocation() {
        MapLocationUtil.getInstance().setSpan(2000);
    }

    private void setNet() {
        try {
            OkGo.getInstance()
                    // 打开该调试开关,打印级别INFO,并不是异常,是为了显眼,不需要就不要加入该行
                    // 最后的true表示是否打印okgo的内部异常，一般打开方便调试错误
                    .debug("OkGo", Level.INFO, true)
                    //如果使用默认的 60秒,以下三行也不需要传
                    .setConnectTimeout(OkGo.DEFAULT_MILLISECONDS)  //全局的连接超时时间
                    .setReadTimeOut(OkGo.DEFAULT_MILLISECONDS)     //全局的读取超时时间
                    .setWriteTimeOut(OkGo.DEFAULT_MILLISECONDS)    //全局的写入超时时间
                    //可以全局统一设置超时重连次数,默认为三次,那么最差的情况会请求4次(一次原始请求,三次重连请求),不需要可以设置为0
                    .setRetryCount(3)
                    //如果不想让框架管理cookie（或者叫session的保持）,以下不需要
//                    .setCookieStore(new MemoryCookieStore())            //cookie使用内存缓存（app退出后，cookie消失）
//                    .setCookieStore(new PersistentCookieStore())        //cookie持久化存储，如果cookie不过期，则一直有效

                    //可以设置https的证书,以下几种方案根据需要自己设置
                    .setCertificates();                                  //方法一：信任所有证书,不安全有风险
//                    .setCertificates(new SafeTrustManager())            //方法二：自定义信任规则，校验服务端证书
//                    .setCertificates(getAssets().open("srca.cer"))      //方法三：使用预埋证书，校验服务端证书（自签名证书）
            //方法四：使用bks证书和密码管理客户端证书（双向认证），使用预埋证书，校验服务端证书（自签名证书）
//                    .setCertificates(getAssets().open("xxx.bks"), "123456", getAssets().open("yyy.cer"))

            //配置https的域名匹配规则，详细看demo的初始化介绍，不需要就不要加入，使用不当会导致https握手失败
//                    .setHostnameVerifier(new SafeHostnameVerifier())


        }catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 实现单例模式
     * @return
     */
    public static MyApplication getInstance() {
        return instance;
    }

    /**
     * 获取包信息
     */
    private void getAppInfo() {
        // 获取packageManager的实例
        PackageManager packageManager = getPackageManager();
        try {
            packageInfo = packageManager.getPackageInfo(getPackageName(), 0);
        } catch (PackageManager.NameNotFoundException e) {
            e.printStackTrace();
        }
    }


    /**
     * 方法名称：getVersionName
     * <p/>
     * 方法描述：获取系统的版本名称 versionName
     *
     * @return versionName 4.2
     * <p/>
     * 备注：
     * @author wangZhongfu
     */
    public String getVersionName() {
        if (packageInfo == null) {
            getAppInfo();
        }
        return packageInfo != null ? packageInfo.versionName : "";
    }


    /**
     * 方法名称：getVersionCode
     * <p/>
     * 方法描述：获取系统的版本名称 versionCode
     *
     * @return versionCode 4.2
     * <p/>
     * 备注：
     * @author wangZhongfu
     */
    public String getVersionCode() {
        if (packageInfo == null) {
            getAppInfo();
        }
        return packageInfo != null ? "" + packageInfo.versionCode : "0";
    }

    /**
     * 获取设备信息
     */
    private void getTelephonyManager() {
        telephonyManager = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
    }

    /**
     * 获取设备唯一标识 imei
     *
     * @return
     */
    public String getDeviceId() {
        try {
            if (telephonyManager == null) {
                getTelephonyManager();
            }
            return telephonyManager != null ? (telephonyManager.getDeviceId() != null && !telephonyManager.getDeviceId().equals("") ? telephonyManager.getDeviceId() : "0") : "0";
        }catch (Exception e){
            return "0";
        }

    }
}
